package com.kamistoat.meimeimall.common.sharding;

/**
 * 分库分表上下文，用于传递链接参数。
 * 使用完成后必须及时调用clear方法清空上下文。
 */
public class ShardingContext {

    /**
     * 确定了一个分库分表后，记录子库对应的链接DataSource的名称。
     * 使用 基础库名+主从标识+子库序号 做名称。
     */
    private static final ThreadLocal<String> SHARDING_DATABASE = new ThreadLocal<>();

    /**
     * 确定了一个分库分表后，记录子表名称。
     * 使用 基础表名_子表序号 做名称。
     */
    private static final ThreadLocal<String> SHARDING_TABLE = new ThreadLocal<>();

    /**
     * 确定了一个分库分表后，记录主从标识。默认是主
     */
    private static final ThreadLocal<String> MASTER_SALVE = new ThreadLocal<String>() {
        @Override
        protected String initialValue() {
            return ShardingConstants.MASTER;
        }
    };

    public static String getShardingDatabase() {
        return SHARDING_DATABASE.get();
    }

    public static void setShardingDatabase(String shardingDatabase) {
        SHARDING_DATABASE.set(shardingDatabase);
    }

    public static String getShardingTable() {
        return SHARDING_TABLE.get();
    }

    public static void setShardingTable(String shardingTable) {
        SHARDING_TABLE.set(shardingTable);
    }

    public static String getMasterSalve() {
        return MASTER_SALVE.get();
    }

    public static void setMasterSalve(String masterSalve) {
        MASTER_SALVE.set(masterSalve);
    }

    public static void clear() {
        ShardingContext.SHARDING_DATABASE.remove();
        ShardingContext.SHARDING_TABLE.remove();
        ShardingContext.MASTER_SALVE.remove();
    }
}
